/**
* \file FabriquePoidsMoucheCase.cpp
* \brief Ensemble des methodes de la classe FabriquePoidsMoucheCase
* \author FEKI Mehdi && RIPOCHE Emilien
* \version 1.0
* \date 04/12/2011
*/

#include "FabriquePoidsMoucheCase.h"
#include "CaseStationOrbitale.h"
#include "CaseArtefact.h"
#include "CaseAsteroide.h"
#include "CaseEnergie.h"
#include "CaseVide.h"
#include <iostream>

using namespace std;

// Initialisation de l'attribut statique
FabriquePoidsMoucheCase* FabriquePoidsMoucheCase::INSTANCE = NULL;

FabriquePoidsMoucheCase::FabriquePoidsMoucheCase() {
	map<string, Case*> mapCases();
}

FabriquePoidsMoucheCase* FabriquePoidsMoucheCase::getSingletonFabriquePoidsMoucheCase() {
	if (INSTANCE == NULL) {
		//cout << "Creation du singleton FabriquePoidsMoucheCase..." << endl;
		INSTANCE = new FabriquePoidsMoucheCase();
	}
	else {
		//cout << "Singleton FabriquePoidsMoucheCase deja cree !" << endl;
	}
	return INSTANCE;
}

Case* FabriquePoidsMoucheCase::creerCase(Case::TypeCase typeCase) {
	switch(typeCase) {
		case Case::Artefact :
			return new CaseArtefact();
			break;
		case Case::StationOrbitale :
			return new CaseStationOrbitale();
			break;
		case Case::Asteroide :
		{
			Case* c = mapCases[typeCase];
			if(c == NULL) {
				CaseAsteroide* ca = new CaseAsteroide();
				mapCases[typeCase] = ca;
				return ca;
			}
			else {
				return c;
			}
			break;
		}
		case Case::Energie :
		{
			Case* c = mapCases[typeCase];
			if(c == NULL) {
				CaseEnergie* ce = new CaseEnergie();
				mapCases[typeCase] = ce;
				return ce;
			}
			else {
				return c;
			}
			break;
		}
		case Case::Vide :
		{
			Case* c = mapCases[typeCase];
			if(c == NULL) {
				CaseVide* cv = new CaseVide();
				mapCases[typeCase] = cv;
				return cv;
			}
			else {
				return c;
			}
			break;
		}
		default :
			{
			cout << "ERREUR : methode FabriquePoidsMoucheCase::creerCase()" << endl;
			return  NULL;
			break;
		}
	}
}

void FabriquePoidsMoucheCase::destructeurFabriquePoidsMoucheCase() {
	//cout << "DestructeurFabriquePoidsMoucheCase()" << endl;
	if(INSTANCE != NULL) {
		delete INSTANCE;
		INSTANCE = NULL;
	} 
}